<?php
/* 
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 * Description of classArchivo
 *
 * @author kumda
 */
class Archivo {
    //put your code here
    public $propietario_archivo="";
    public $var_archivo;
    public $nombre="";
    public $nombreTemp="";
    public $size="";
    public $sizeReal="";
    public $type="";
    public $error="";
    public $espacioLibre="";
    public $directorioActual="";
    public $contenido="";
    public $titulo="";
    public $descripcion="";
    public $compartir="";
    public $fecha_upload="";
    

    function __Construct(){
        
        $this->SetDirectorioActual();
        $this->SetVarArchivo();
        
    }

    public function SetTitulo($valor="DEFAULT"){
        if ($valor=="DEFAULT") {
            if (isset($_POST['titulo'])) {
                $this->titulo=$_POST['titulo'];
                return true;
            }else {
                return false;
            }
        }else {
            if ($valor!="") {
                $this->titulo=$valor;
                return true;
            }else {
                return false;
            }
        }
    }

    public function GetTitulo(){
        if (Core::ValidacionBasica($this->titulo)) {
            return $this->titulo;
        }else {
            Core::MsgError("ERROR!, Debe ingresar un titulo.".Core::Atras());
            exit;
        }
    }

    public function SetDescripcion($valor="DEFAULT"){
        if ($valor=="DEFAULT") {
            if (Core::ValidacionBasica($_POST['descripcion'])) {
                $this->descripcion=$_POST['descripcion'];
                return true;
            }else {
                return false;
            }
        }else {
            if ($valor!="") {
                $this->descripcion=$valor;
                return true;
            }else {
                return false;
            }
        }
    }

    public function GetDescripcion(){
        if (Core::ValidacionBasica($this->descripcion)) {
            return $this->descripcion;
        }else {
            Core::MsgError("ERROR!, Debe ingresar una descripci&oacute;n.".Core::Atras());
            exit;
        }
    }

    public function SetCompartir($valor="DEFAULT"){
        if ($valor=="DEFAULT") {
            if (isset($_POST['compartir'])) {
                if ($_POST['compartir']=="default") {
                    Core::MsgError("Debe seleccionar un &iacute;tem de la lista 'Compartir con'.".Core::Atras());
                    exit;
                }

                $this->compartir=$_POST['compartir'];
                return true;
            }else {
                return false;
            }
        }else {
            if ($valor!="") {
                $this->compartir=$valor;
                return true;
            }else {
                return false;
            }
        }
    }

    public function GetCompartir(){
        if ($this->compartir!="") {
            return $this->compartir;
        }
    }

    public function FormUp($action="DEFAULT"){
        // muestra el formulario de subida
        if ($action=="DEFAULT") {
            $action=$_SERVER['PHP_SELF'];
        }
        $formulario=<<<eof
        <div id="divFormUp" class="classFormUp">
        <form id="FormUpArchivo" name="FormUpArchivo" action="$action" enctype="multipart/form-data" method="post">
        <label class="labelFormUp" for="titulo">Titulo</label><br><input type="text" class="inputFormUp" name="titulo" id="titulo"><br>
        <label class="labelFormUp" for="descripcion">Descripcion</label><br><textarea id="descripcion" name="descripcion" class="areaFormUp"></textarea><br>
        <label class="labelFormUp" for="compartir">Compartir con</label><br>
        <select name="compartir" id="compartir">
        <option value="default" selected>-seleccionar-</option>
        <option value="nadie">Nadie</option>
        <option value="todos">Todos</option>
        <option value="usuario">Un Usuario</option>
        <option value="grupo_usuarios">Un Grupo de Usuarios</option>
        </select><br>
        <label class="labelFormUp" for="$this->var_archivo">Archivo</label><br><input type="file" id="$this->var_archivo" name="$this->var_archivo">
        <input type="hidden" name="max_file_size" value="4194304"> <!-- 4 MB --><br>
        <input type="submit" id="btnSubirDocumento" class="btnFormUp" value="Subir Documento">
        </form>
        </div>
eof;
return $formulario;
    }// Fin del Metodo

    public function SetPropietario($valor="DEFAULT"){
        if ($valor=="DEFAULT") {
            if (isset($_SESSION['id_username'])) {
            $this->propietario_archivo=$_SESSION['id_username'];
            return true;
        }else{
            Core::MsgError("Error, usuario invalidado para subir archivo. "
                ."Comuniquese con el administrador del sistema y solicite "
                ."los privilegios necesarios.".Core::Atras());
            exit;
        }
    }else {
            $this->propietario_archivo=$valor;
            return true;
        }
    }

    public function VerificaPropietario(){
        if (!isset($this->propietario_archivo) || empty($this->propietario_archivo)) {
            Core::MsgError("ERROR!, debe invocar el metodo 'SetPropietario'.".Core::Atras());
            exit;
        }else {
            return true;
        }
    }

/**
 *Este metodo asigna el nombre de la variable html donde se almacenará el archivo subido.
 *
 * @param String $nombre Parametro opcional, representa el nombre de la variable html del input File del formulario.
 * @return Boolean un comentario adicional.
 */
    public function SetVarArchivo($nombre="DEFAULT"){
        if ($nombre == "DEFAULT") {
            $this->var_archivo="archivo";
            return true;
        }
        if ((isset($nombre)) && ($nombre!="")) {
            $this->var_archivo=$nombre;
        }else {
            Core::MsgError("Error, metodo 'SetVarArchivo' fallo debido a un mal pase de parametros.");
            return false;
        }
    }

    public function IsUpload(){
        $this->VerificaPropietario();
        if (is_uploaded_file($_FILES[$this->var_archivo]['tmp_name'])) {
            $this->nombre=$_FILES[$this->var_archivo]['name'];
            $this->nombreTemp=$_FILES[$this->var_archivo]['tmp_name'];
            $this->size=$_FILES[$this->var_archivo]['size'];
            $this->sizeReal=$_FILES[$this->var_archivo]['size'];
            $this->type=$_FILES[$this->var_archivo]['type'];
            $this->error=$_FILES[$this->var_archivo]['error'];
            $this->SetTitulo();
            $this->SetDescripcion();
            $this->SetCompartir();
            return true;
        }else {
        return false;
    }
    }

    public function GetNombre(){
        if ($this-nombre!="") {
            return $this->nombre;
        }else {
            return false;
        }
    }

    public function GetNombreTemp(){
        if ($this->nombreTemp!="") {
            return $this->nombreTemp;
        }else {
            return false;
        }
    }

    public function GetSize(){
        $xSize;
        if ($this->size!="") {
            if ($this->size<1024) {
                $xSize=number_format($this->size,0,'.',',');
                $xSize.=" Bytes.";
            }elseif (($this->size>=1024) && ($this->size<1048576)) {
                $xSize=number_format($this->size/1024,2,'.',',');
                $xSize.=" KBs.";
            }elseif ($this->size>=1048576) {
                 $xSize=number_format($this->size/1048576,2,'.',',');
                $xSize.=" MB.";
            }

            return $xSize;
        }else {
            return false;
        }
    }

    public function GetType(){
        if ($this->type!="") {
            return $this->type;
        }else {
            return false;
        }
    }

    public function GetSizeReal(){
        if ($this->sizeReal!="") {
            return $this->sizeReal;
        }else{
            return false;
        }
    }

    public function GetError(){
        if ($this->error!="") {
            return $this->error;
        }else {
            return false;
        }
    }

    public function EspacioLibre($medida="m",$directorio="DEFAULT"){
        if ($directorio=="DEFAULT") {
            $dir=getcwd();
        }else {
            $dir=$directorio;
        }
        
    $byte=$space=disk_free_space($dir);
    $kb=$space/=1024;
    $mb=$space/=1024;
    $gb=$space/=1024;
    if ($medida=="b") {
            return round($byte * 100)/100;
        }elseif ($medida=="k") {
            return round($kb * 100)/100;
        }elseif ($medida=="m") {
            return round($mb * 100)/100;
        }elseif ($medida=="g") {
            return round($gb * 100)/100;
        }else {
            return false;
        }
        
    }

    public function SetEspacioLibre($medida="m"){
        if ($this->espacioLibre=$this->EspacioLibre($medida)) {
            return true;
        }else {
            return false;
        }
    }// Fin de Metodo

    public function GetEspacioLibre(){
        if ($this->espacioLibre!="") {
            return $this->espacioLibre;
        }else {
            return false;
        }
    }// Fin de Metodo

    public function SetDirectorioActual(){
        $this->directorioActual=getcwd();
    }

    public function GetDirectorioActual(){
        if ($this->directorioActual!="") {
            return $this->directorioActual;
        }else {
            return false;
        }
    }//Fin del metodo


/**
 *Se requiere tener creado el directorio archivo en la url del Document_root,
 * el propietario del directorio debe ser 'www-data', con permisos 744.
 * @param <type> $dir
 * @return <type>
 */
    public function GuardarArchivoEnCarpeta($dir="DEFAULT"){
        if ($dir=="DEFAULT") {
            $dir=$_SERVER['DOCUMENT_ROOT'];
            $dir.="archivos";
        }
        if ($this->IsUpload()) {
            if (move_uploaded_file($this->GetNombreTemp(),"$dir/".$this->GetNombre())) {
                Core::MsgExito("Exito!, el archivo '<b>".$this->GetNombre()."</b>' de un peso de <b>".$this->GetSize()."</b> se a guardado correctamente.".Core::AtrasURL($_SERVER['PHP_SELF'],"Terminar"));
                return true;
            }else {
                Core::MsgError("ERROR!, el archivo '".$upload->nombre."' no se pudo guardar.".Core::Atras());
                return false;
            }
        }else {
            return false;
        }
    }// fin de metodo

    public function GetContenido(){
        if ($this->contenido!="") {
            return $this->contenido;
        }else {
            Core::MsgError("ERROR!, no se ha definido el contenido del archivo.");
            exit;
        }
    }

    public function GetPropietario(){
        if ($this->VerificaPropietario()) {
            return $this->propietario_archivo;
        }else {
            return false;
        }
    }



    public function GuardarArchivoEnBD(){
        if ($this->IsUpload()) {
            $fp=fopen($this->GetNombreTemp(),"rb");
            $this->contenido=fread($fp,$this->sizeReal);
            $this->contenido=addslashes($this->contenido);
            fclose($fp);

            $bd=new BD();
            $consulta="INSERT INTO archivos VALUES(NULL,'".$this->GetTitulo()."','"
            .$this->GetDescripcion()."','".$this->GetContenido()
            ."',".$this->GetSizeReal().",'".$this->GetNombre()."','".$this->GetSize()
            ."','".$this->GetCompartir()."',".$this->GetPropietario().",'".$this->GetType()."',now());";
            $bd->Query($consulta);
            $afectados=$bd->punteroBD->affected_rows;
            if ($afectados!=1) {Core::MsgError("ERROR!, no se pudo guardar su archivo en la Base de Datos, "
                    ."por favor verifique sus datos e intentelo nuevamente. "
                    ."Si el problema persiste, por favor comuniquese con el administrador del sistema: "
                    ."Jon&aacute;s Reyes - jonasrey@gmail.com.".Core::Atras());exit;}else {
                Core::MsgExito("Exito!, el archivo '<b>".$this->GetNombre()."</b>' de un peso de <b>".$this->GetSize()."</b> se a guardado correctamente.".Core::AtrasURL($_SERVER['PHP_SELF'],"Terminar"));
                return true;
            }
        }
        
    }//Fin del metodo

    public function ShowArchivosBDUser($id){
        if (!isset($id)) {
            Core::MsgError("ERROR!, debe ingresar un id cuando invoque el metodo 'ShowArchivosBDUser()'.");
            return false;
        }
        $bd=NEW BD();
        $sql="SELECT * FROM archivos WHERE propietario_id=$id;";
        $bd->Query($sql);
        $afectados=$bd->punteroBD->affected_rows;
        if ($afectados < 1) {
            return Core::Msg("No hay archivos cargados por el usuario.");
        }
$tabla=<<<eof
<table class="TabShowArchivosBDUser">
    <tr class="TrShowArchivosBDUserHEAD">
    <th>Tipo</th><th>Nombre del Archivo</th><th>Tamaño</th><th>Fecha subido al servidor</th><th>Compartido con</th><th>Descargar</th><th>Eliminar</th>
    </tr>
eof;
        
       $clase='class="TrShowArchivosBDUserAzul"';
        while ($archivos=$bd->resultado->fetch_assoc()) {
$tabla.='
<tr '.$clase.'>
    <td>'.$this->ShowIcon($archivos['tipo']).'</td><td><b>'.$archivos['nombre_archivo'].'</b></td><td>'.$archivos['size_unidad'].'</td><td>'.$archivos['fecha_up'].'</td><td></td><td></td><td></td>
</tr>';
           if ($clase=='class="TrShowArchivosBDUserAzul"') {
               $clase='class="TrShowArchivosBDUserGris"';
           }else {
               $clase='class="TrShowArchivosBDUserAzul"';
           }
       }
$tabla.='</table>';

return $tabla;
        
    }//Fin del Metodo

    public function ShowArrayAll($where="DEFAULT"){
        if ($where=="DEFAULT") {
            $whr="";
        }else {
            $whr=$where." ";
        }
        $bd=NEW BD();
        $sql="SELECT * FROM archivos ".$whr."ORDER BY tipo,nombre_archivo,fecha_up;";
        $bd->Query($sql);
        $afectados=$bd->punteroBD->affected_rows;
        if ($afectados < 1) {
            Core::Msg("AVISO: No existen archivos cargados en la actualidad.");
            exit;
        }
        $Arreglo;
        while ($archivos=$bd->resultado->fetch_assoc()) {
            $Arreglo[]=array('id'=>$archivos['id']
                ,'user_id'=>$archivos['propietario_id']
                ,'tipo'=>$archivos['tipo']
                ,'nombre'=>$archivos['nombre_archivo']
                ,'titulo'=>$archivos['titulo']
                ,'descripcion'=>$archivos['descripcion']
                ,'contenido'=>$archivos['contenido']
                ,'size'=>$archivos['size']
                ,'sizef'=>$archivos['size_unidad']
                ,'compartir'=>$archivos['compartir']
                ,'fecha_up'=>$archivos['fecha_up']);
        }


return $Arreglo;
/*
 * ejemplo:
 * $upload=new Archivo();
 * $arreglo=$upload->ShowArrayAll("where tipo='image/jpeg'");
 * foreach ($arreglo as $clave => $valor) {
 *     echo($valor['id']."->".$valor['nombre']."->".$valor['fecha_up']."->:".$valor['user_id']."<br>");
 * }
 */

    }// Fin del Metodo

    public function ShowId($id="DEFAULT",$where="DEFAULT"){
        /*
         * Debe devolver un array con los datos del id pasado, tambien se puede pedir los datos del primer archivo
         * del ultimo.
         */
        if ($id=="DEFAULT") {
            // Si no se define el parametro se asume que se desea obtener el
            //ultimo registro (archivo) ingresado en la tabla
            $sql="SELECT * FROM archivos ".$whr."ORDER BY id DESC LIMIT 0,1;";
        }elseif ($id=="firs" || $id=="primero" || $id=="p" || $id=="P") {
            //Se asume que se desea obtener el primer registro en la tabla
            $sql="SELECT * FROM archivos ".$whr."ORDER BY id LIMIT 0,1;";
        }elseif (ctype_digit($id)) {
            // en caso de que se se defina un id, el segundo parametro del
            // metodo será para añadir un complemento al WHERE. Debe iniciarse
            // la expresión con AND.
            $sql="SELECT * FROM archivos WHERE id=".$id." ".$whr.";";
        }else {
            Core::MsgError("ERROR!, debe ingresar un argumento válido en el metodo 'ShowId()'. "
                ."Recuerde, para indicar se muestre el primer archivo de la tabla, defina "
                ."el primer parametro con los terminos: 'firs', 'primero', 'p', o 'P'.");
            return false;
        }

        if ($where=="DEFAULT") {
            $whr="";
        }else {
            $whr=$where." ";
        }

        $bd=NEW BD();
        $bd->Query($sql);
        $afectados=$bd->punteroBD->affected_rows;
        if ($afectados < 1) {
            // se asume que no hay archivos en la BD.
            return false;
        }else {
            $archivo=$bd->resultado->fetch_assoc();
            return $archivo;
        }

        /*
         * Ejemplo:
         * if ($only=$upload->ShowId("15")) {
         *  echo("<br>Ultimo archivo:<br>");
         *  echo($upload->ShowIcon($only['tipo'])."->".$only['nombre_archivo']."->".$only['fecha_up'].".");
         * }
         */

    }// Fin del Metodo

    public function ShowIcon($tipo){
        if ($tipo=="application/msword") {
            $icono="doc.png";
        }elseif ($tipo=="application/vnd.oasis.opendocument.text") {
            $icono="ooo-writer.png";
        }elseif ($tipo=="application/pdf") {
            $icono="pdf.png";
        }elseif ($tipo=="application/vnd.oasis.opendocument.spreadsheet") {
            $icono="ooo-calc.png";
        }elseif ($tipo=="application/vnd.oasis.opendocument.graphics") {
            $icono="ooo-draw.png";
        }elseif ($tipo=="application/vnd.oasis.opendocument.presentation") {
            $icono="ooo-impress.png";
        }elseif ($tipo=="application/vnd.oasis.opendocument.database") {
            $icono="ooo-base.png";
        }elseif ($tipo=="application/vnd.sun.xml.base") {
            $icono="ooo-base.png";
        }elseif ($tipo=="application/vnd.ms-excel") {
            $icono="xls.png";
        }elseif ($tipo=="application/powerpoint") {
            $icono="ppt.png";
        }elseif ($tipo=="image/jpeg") {
            $icono="jpeg.png";
        }elseif ($tipo=="image/png") {
            $icono="png.png";
        }elseif ($tipo=="image/gif") {
            $icono="gif.png";
        }elseif ($tipo=="application/zip") {
            $icono="zip.png";
        }elseif ($tipo=="audio/mpeg3") {
            $icono="mp3.png";
        }else {
            $icono="oth.png";
        }

        $imagen="imagenes/".$icono;
        if (!Core::ValidarExistencia($imagen)) {
            $imagen="../".$imagen;
            if (!Core::ValidarExistencia($imagen)) {
            $imagen="../".$imagen;
        }
        }
        $IMG='<img class="icon_mime" style="display:inline;margin:0 10px 0 0; vertical-align:middle;" src="'.$imagen.'" alt="Icono"></img>';
        return $IMG;
    }// fin fel metodo

    /*
     * Crear metodo para generacion de enlace al archivo en la base de datos, debe
     * permitir especificar el contenido del enlace: campo nombre (default), id, Descripcion,
     * texto 'Descargar'
     */
}
?>